// ============================ routes_myapi.c ============================
// 业务路由示例：使用 httpx* 语法糖，写法更简洁。
// - 支持 GET/POST + :id 路径参数
// - 统一取参：httpx_get_int/str/bool（优先 JSON，其次 query/form）
// - 统一返回：httpx_ok/httpx_okf/httpx_err/httpx_errf
#include <stdio.h>
#include <string.h>
#include "lwip_http_api.h"

// -------- 业务 handler（3 参：额外拿到 pattern，便于提取 :id） --------

// GET /api/sum?a=1&b=2   或 POST {"a":1,"b":2}
static int api_sum(const http_req_t* r, http_res_t* s, const char* pattern){
  (void)pattern;                            // 当前未用到路径占位；防告警
  if (httpx_run_before(r, s)) return 0;    // 可选：拦截/鉴权/CORS 预检

  int a = httpx_get_int(r, "a", 0);
  int b = httpx_get_int(r, "b", 0);
  int ret = httpx_okf(s, "\"sum\":%d", a + b);

  httpx_run_after(r, s, ret);              // 可选：统一日志/指标
  return ret;
}

// POST /api/echo   body: {"msg":"hello"} 或表单 msg=hello
static int api_echo(const http_req_t* r, http_res_t* s, const char* pattern){
  (void)pattern;
  if (httpx_run_before(r, s)) return 0;

  char msg[256]; httpx_get_str(r, "msg", msg, sizeof msg);
  int ret = httpx_okf(s, "\"ok\":true,\"msg\":\"%s\"", msg);

  httpx_run_after(r, s, ret);
  return ret;
}

// POST /api/print   body/query: msg=...
static int api_print(const http_req_t* r, http_res_t* s, const char* pattern){
  (void)pattern;
  if (httpx_run_before(r, s)) return 0;

  char msg[256]; httpx_get_str(r, "msg", msg, sizeof msg);

  // TODO：你的打印业务逻辑
  // ctx.apis.recv->put_data->recv_data(msg, strlen(msg), DATA_ETHERNET);

  int ret = httpx_okf(s, "\"status\":0,\"msg\":\"%s\"", msg);

  httpx_run_after(r, s, ret);
  return ret;
}
static int api_permission(const http_req_t* r, http_res_t* s, const char* pattern){
  (void)pattern;
  if (httpx_run_before(r, s)) return 0;


  // TODO：你的打印业务逻辑
  // ctx.apis.recv->put_data->recv_data(msg, strlen(msg), DATA_ETHERNET);

  int ret = httpx_okf(s, "Result=0&Modules=WiFi,Bluetooth,Ethernet,Serial,Common,Log,Firmware,Command&List=WiFi_MAC,WiFi_Version,...&Print_Speed_Min=2&Print_Speed_Max=5&Print_Density_Min=2&Print_Density_Max=5&Language=zh_cn");

  httpx_run_after(r, s, ret);
  return ret;
}
// -------- 生成包装器（文件作用域声明，不会触发“嵌套函数”报错） --------
HTTPX_DEF_GET ("/api/sum",   api_sum)
HTTPX_DEF_POST("/api/echo",  api_echo)
HTTPX_DEF_POST("/api/print", api_print)

// -------- 注册入口：仅做注册调用 --------
void HTTP_API_user_routes(void){
  HTTPX_ROUTE_GET (api_sum);
  HTTPX_ROUTE_POST(api_echo);
  HTTPX_ROUTE_POST(api_print);

  // （可选）统一 before/after：
  // httpx_set_before([](const http_req_t* r, http_res_t* s){
  //   // 例：简单 OPTIONS 预检快速通过
  //   // if (strcmp(r->method_str, "OPTIONS")==0) { httpx_ok(s); return 1; }
  //   return 0;
  // });
  // httpx_set_after([](const http_req_t* r, http_res_t* s, int ret){
  //   (void)r; (void)s; (void)ret; // 统一日志/计数
  // });
}
